package com.lanhao.aot.poster;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;

import org.apache.commons.io.IOUtils;

import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;

import cn.hutool.core.date.DateUtil;

public class PosterUtil {
	public static void main(String[] args) {
		generateCertificateImage("D://template.jpg", "D://", "王二麻", "34242519900715456X", new Date(), "业务架构师培训业务架构师培训业务架构师啊", "X202109092126034", "D://QQ截图20210918185807.png");
	}
	
	/**
	 * 生成证书图片
	 * @param templatePath  -- 模板图片地址
	 * @param generatePath  -- 生成证书的磁盘地质
	 * @param userName  -- 姓名
	 * @param idCardNo  -- 身份证号
	 * @param startDate  -- 培训开始日期
	 * @param trainingName -- 培训名称
	 * @param certificateNo -- 证书编号
	 * @return
	 */
	public static String generateCertificateImage(String templatePath, String generatePath, String userName,
			String idCardNo, Date startDate, String trainingName, String certificateNo, String avatarPath) {
		InputStream inputStream = null;
		OutputStream outStream = null;
		try {
			BufferedImage image = ImageIO.read(new File(templatePath));
			Graphics2D gd = image.createGraphics();
			gd.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
			gd.setColor(Color.BLACK);
			gd.setFont(new Font("黑体", Font.PLAIN, 24));

			Date now = new Date();
			// 姓名
			gd.drawString(userName, 280, 410);
			// 身份证号
			gd.drawString(idCardNo, 680, 410);
			// 开始-年
			gd.drawString(String.valueOf(DateUtil.year(startDate)), 195, 465);
			// 开始-月
			gd.drawString(String.valueOf(DateUtil.month(startDate) + 1), 295, 465);
			// 开始-日
			gd.drawString(String.valueOf(DateUtil.dayOfMonth(startDate)), 350, 465);
			// 结束-年
			gd.drawString(String.valueOf(DateUtil.year(now)), 430, 465);
			// 结束-月
			gd.drawString(String.valueOf(DateUtil.month(now) + 1), 530, 465);
			// 结束-日
			gd.drawString(String.valueOf(DateUtil.dayOfMonth(now)), 600, 465);
			// 培训名称-第一部分  注意处理字符串截取越界，这里没处理
			gd.drawString(trainingName.substring(0, 7), 820, 465);
			// 培训名称-第二部分 注意处理字符串截取越界，这里没处理
			gd.drawString(trainingName.substring(7), 180, 515);
			// 证书编号
			gd.drawString(certificateNo, 320, 640);
			// 时间戳-年
			gd.drawString(String.valueOf(DateUtil.year(now)), 730, 680);
			// 时间戳-月
			gd.drawString(String.valueOf(DateUtil.month(now) + 1), 840, 680);
			// 时间戳-日
			gd.drawString(String.valueOf(DateUtil.dayOfMonth(now)), 890, 680);
			
			Image avatarFile = ImageIO.read(new File(avatarPath));
			gd.drawImage(avatarFile, 850, 200, null);
			
			gd.dispose();

			String returnFilePath = generatePath + "/" + userName + ".png";

			File destFile = new File(returnFilePath);
			ByteArrayOutputStream bs = new ByteArrayOutputStream();
			ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
			ImageIO.write(image, "png", imOut);
			inputStream = new ByteArrayInputStream(bs.toByteArray());
			outStream = new FileOutputStream(destFile);
			IOUtils.copy(inputStream, outStream);
			return returnFilePath; // 磁盘上的地址
		} catch (Exception e) {
			e.printStackTrace();
			return StringUtils.EMPTY;
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
				if (inputStream != null) {
					outStream.close();
				}
			} catch (Exception x) {
				x.printStackTrace();
			}
		}
	}

}
